package com.test.handler;

import com.test.registry.BeanDefinitionRegistry;
import org.dom4j.Element;

/**
 * Context命名空间处理器
 * 用于解析XML配置中特定命名空间下的元素和属性
 */
public class ContextNamespaceHandler extends AbstractNamespaceHandler{
    /**
     * 初始化方法
     * 注册元素解析器和属性装饰器
     */
    @Override
    public void init() {
        //注册property-placeholder元素解析器
        registerElementParser("property-placeholder", new PropertyPlaceholderElementParser());
        //注册component-scan元素解析器
        registerElementParser("component-scan", new ComponentScanElementParser());

        //注册default_lazy-init属性装饰器
        registerAttributeDecorator("default_lazy-init", new DefaultLazyInitAttributeDecorator());
    }

    /**
     * 属性占位符元素解析器
     * 用于解析property-placeholder元素
     */
    private static class PropertyPlaceholderElementParser implements ElementParser{
        /**
         * 解析property-placeholder元素
         * 加载属性文件但不实际创建PropertyPlaceholderConfigurer Bean
         *
         * @param element XML配置文件中的元素
         * @param registry Bean定义注册表
         */
        @Override
        public void parse(Element element, BeanDefinitionRegistry registry) {
            String location = element.attributeValue("location");
            if ( location != null && !location.isEmpty()){
                System.out.println("解析 property-placeholder 元素， 加载属性文件" + location);
                //实际实现中，这里应该加载属性文件创建PropertyPlaceholderConfigurer Bean
            }
        }
    }

    /**
     * 组件扫描元素解析器
     * 用于解析component-scan元素
     */
    private static class ComponentScanElementParser implements ElementParser{
        /**
         * 解析component-scan元素
         * 扫描指定包下的组件但不实际注册为bean
         *
         * @param element XML配置文件中的元素
         * @param registry Bean定义注册表
         */
        @Override
        public void parse(Element element, BeanDefinitionRegistry registry) {
            String basePackage = element.attributeValue("base-package");
            if ( basePackage != null && !basePackage.isEmpty()){
                System.out.println("解析 component-scan 元素，扫描包" + basePackage);
                //实际实现中，这里应该扫描指定包下的组件并注册为bean
            }
        }
    }

    /**
     * 默认延迟初始化属性装饰器
     * 用于处理default_lazy-init属性
     */
    private static class DefaultLazyInitAttributeDecorator implements AttributeDecorator{
        /**
         * 装饰具有default_lazy-init属性的元素
         * 设置所有bean的默认延迟初始化属性但不实际设置
         *
         * @param element XML配置文件中的元素
         * @param attributeName 属性名称
         * @param registry Bean定义注册表
         */
        @Override
        public void decorate(Element element, String attributeName, BeanDefinitionRegistry registry) {
            String value = element.attributeValue(attributeName);
            if ("true".equals(value)){
                System.out.println("设置默认延迟初始化为true");
                //实际实现中，这里应该设置所有bean的默认延迟初始化属性
            }
        }
    }
}
